//package com.ruoyi.system.interceptor;
//
//import com.ruoyi.system.domain.SysDataFieldMap;
//import com.ruoyi.system.service.ISysDataLineageService;
//import com.ruoyi.system.utils.SpringContextUtils;
//import net.sf.jsqlparser.JSQLParserException;
//import net.sf.jsqlparser.parser.CCJSqlParserUtil;
//import net.sf.jsqlparser.statement.Statement;
//import net.sf.jsqlparser.statement.insert.Insert;
//import net.sf.jsqlparser.statement.select.Select;
//import org.apache.ibatis.executor.Executor;
//import org.apache.ibatis.mapping.MappedStatement;
//import org.apache.ibatis.plugin.*;
//import org.springframework.stereotype.Component;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Properties;
//
//@Component
//@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
//public class SqlLineageInterceptor implements Interceptor {
//
//    private ISysDataLineageService lineageService;
//
//    @Override
//    public Object intercept(Invocation invocation) throws Throwable {
//        if (lineageService == null) {
//            lineageService = SpringContextUtils.getBean(ISysDataLineageService.class);
//        }
//
//        MappedStatement ms = (MappedStatement) invocation.getArgs()[0];
//        String sql = ms.getSqlSource().getBoundSql(invocation.getArgs()[1]).getSql();
//
//        // 解析SQL并记录血缘（包含字段映射）
//        parseSqlAndRecordLineage(sql);
//
//        return invocation.proceed();
//    }
//
//    private void parseSqlAndRecordLineage(String sql) {
//        try {
//            Statement statement = CCJSqlParserUtil.parse(sql);
//            if (statement instanceof Insert) {
//                Insert insert = (Insert) statement;
//                String targetTable = insert.getTable().getName();
//
//                // 解析目标表字段
//                List<String> targetFields = new ArrayList<>();
//                insert.getColumns().forEach(col -> targetFields.add(col.getColumnName()));
//
//                // 解析源表和源字段（以INSERT SELECT为例）
//                if (insert.getSelect() != null) {
//                    String sourceTable = extractTableFromSelect(insert.getSelect());
//                    List<String> sourceFields = extractFieldsFromSelect(insert.getSelect());
//
//                    // 构建字段映射关系（简单对应，实际需根据SQL逻辑处理）
//                    List<SysDataFieldMap> fieldMaps = buildFieldMaps(sourceFields, targetFields);
//
//                    // 记录血缘和字段映射
//                    lineageService.recordLineageWithFields(
//                        sourceTable, "table",
//                        targetTable, "table",
//                        "insert",
//                        fieldMaps
//                    );
//                }
//            }
//        } catch (JSQLParserException e) {
//            log.warn("SQL解析失败: {}", sql);
//        }
//    }
//
//    /**
//     * 构建字段映射关系（简化版：按位置对应）
//     */
//    private List<SysDataFieldMap> buildFieldMaps(List<String> sourceFields, List<String> targetFields) {
//        List<SysDataFieldMap> maps = new ArrayList<>();
//        int minSize = Math.min(sourceFields.size(), targetFields.size());
//
//        for (int i = 0; i < minSize; i++) {
//            SysDataFieldMap map = new SysDataFieldMap();
//            map.setSourceField(sourceFields.get(i));
//            map.setTargetField(targetFields.get(i));
//            map.setMappingRule("直接映射"); // 实际场景需根据SQL逻辑解析
//            maps.add(map);
//        }
//        return maps;
//    }
//
//    // 从SELECT语句中提取字段名（简化实现）
//    private List<String> extractFieldsFromSelect(Select select) {
//        List<String> fields = new ArrayList<>();
//        // 实际项目中使用JSqlParser的SelectBody解析字段
//        // 这里为示例返回固定字段
//        fields.add("id");
//        fields.add("name");
//        fields.add("create_time");
//        return fields;
//    }
//
//    // 从SELECT语句中提取表名（简化实现）
//    private String extractTableFromSelect(Select select) {
//        return "unknown_table";
//    }
//
//    @Override
//    public Object plugin(Object target) {
//        return Plugin.wrap(target, this);
//    }
//
//    @Override
//    public void setProperties(Properties properties) {}
//}
